#ifndef EL_PROTOCOL_WEBSOCKET_EVENT_PROCESSOR_H
#define EL_PROTOCOL_WEBSOCKET_EVENT_PROCESSOR_H

#include <string>
#include <functional>
#include <unordered_map>
#include <memory>
#include <nlohmann/json.hpp>
#include "web_server.h"

namespace El {
namespace Protocol {

/**
 * @brief WebSocket事件处理器
 * 处理WebSocket事件，实现JSON-RPC 2.0协议
 */
class WebSocketEventProcessor {
public:
    /**
     * @brief 获取单例实例
     * @return WebSocketEventProcessor单例引用
     */
    static WebSocketEventProcessor &GetInstance();

    /**
     * @brief 处理WebSocket事件
     * @param event WebSocket事件
     * @return 响应消息，如为空则不需要响应
     */
    std::string ProcessEvent(std::shared_ptr<El::WebServer::WebSocketEvent> &event);

private:
    WebSocketEventProcessor() = default;
    ~WebSocketEventProcessor() = default;

    /**
     * @brief 方法处理函数类型
     */
    using MethodHandler = std::function<nlohmann::json(const std::string&, const nlohmann::json&)>;

    /**
     * @brief 方法处理器映射表
     */
    std::unordered_map<std::string, MethodHandler> method_handlers_;

    /**
     * @brief 初始化方法处理器
     */
    void InitMethodHandlers();

    /**
     * @brief 解析JSON-RPC请求
     * @param message 请求消息
     * @param id [out] 请求ID
     * @param method [out] 请求方法
     * @param params [out] 请求参数
     * @return 是否解析成功
     */
    bool ParseRequest(const std::string &message, std::string &id, std::string &method, nlohmann::json &params);

    /**
     * @brief 生成错误响应
     * @param id 请求ID
     * @param code 错误码
     * @param message 错误消息
     * @param data 错误详情（可选）
     * @return 错误响应JSON
     */
    nlohmann::json CreateErrorResponse(const std::string &id, int code, const std::string &message, 
                                      const nlohmann::json &data = nullptr);

    /**
     * @brief 生成成功响应
     * @param id 请求ID
     * @param result 响应结果
     * @return 成功响应JSON
     */
    nlohmann::json CreateSuccessResponse(const std::string &id, const nlohmann::json &result);

    // 各种方法处理函数
    nlohmann::json HandleAuthGetChallenge(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleAuthLogin(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleAuthRefreshToken(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleAuthLogout(const std::string &id, const nlohmann::json &params);
    nlohmann::json HandleAuthGetSessions(const std::string &id, const nlohmann::json &params);
    
    // 可根据需要添加更多方法处理函数
};

} // namespace Protocol
} // namespace El

#endif // EL_PROTOCOL_WEBSOCKET_EVENT_PROCESSOR_H
